Lab 1 - Wprowadzenie do ROS - struktury danych
Metody i algorytmy planowania ruchu - laboratorium
Lab 1 - Wprowadzenie do Robot Operating System - struktury danych w planowaniu ruchu i wyświetlanie w RViz
1. Instalacja środowiska
Na zajęciach będziemy używali systemu Linux (Ubuntu 22.04) i Robot Operating System w wersji 2. Wspieraną wersją ROSa dla Ubuntu 22.04 jest Humble Hawksbill. Środowisko ROS2 trzeba zainstalować na swoim komputerze, a instrukcja instalacji znajduje się tutaj: https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html
Po instalacji konieczna jest konfiguracja przestrzeni roboczej (workspace):
https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Configuring-ROS2-Environment.html
2. Wprowadzenie
ROS jest meta-systemem operacyjnym dla robotów o otwartych źródłach. Podobnie jak w systemie operacyjnym dostarczane są np. narzędzia pozwalające na komunikację ze sprzętem i sterowanie niskopoziomowe, komunikację pomiędzy procesami (węzłami) oraz zarządzanie pakietami.
Więcej informacji oraz tutoriale można znaleźć na stronie: https://docs.ros.org/en/humble/Tutorials.html
⚠️ Na komputerach w laboratorium przestrzeń robocza (katalog
~/ros2_ws
) może być czyszczony przy starcie systemu. Jeżeli zamierzasz zrestartować komputer, zrób kopię zapasową swoich danych z tego katalogu.⚠️ Dane na komputerze przechowuj w katalogu
~/Documents
.⚠️ Komputery w laboratorium są używane do wielu zajęć i prac dyplomowych. W przypadku uszkodzenia przywracana jest wersja z kopii zapasowej. Wszystkie dane są wtedy usuwane.
Podczas zajęć zamierzamy używać wielu terminali do uruchamiania poleceń ROSa. Ponieważ przełączanie pomiędzy oknami nie jest efektywne, rekomendujemy trzy inne podejścia:
Podział okna terminala na mniejsze okna - najpopularniejszymi programami, które to umożliwiają są:
Terminator (zalecane rozwiązanie)
Uruchamianie poleceń w zakładkach. Do terminala można dodać nową zakładkę za pomocą polecenia:
Ctrl+Shift+T
. Aby przełączać się pomiędzy zakładkami użyjAlt+numer_zakładki
, np.Alt+1
.
3. Uruchomienie Robot Operating System
W ROS2 nie ma potrzeby uruchamiania centralnego modułu w stylu roscore (ROS Master). Wystarczy skonfigurować środowisko ROS za pomocą polecenia:
source /opt/ros/humble/setup.bash
aby móc korzystać z globalnie zainstalowanych paczek/modułów.
Chcąc pracować w lokalnym środowisku (workspace), wystarczy przejść do odpowiedniej przestrzeni roboczej ROS:
cd ~/ros2_ws
i (jeśli workspace był już zbudowany) skonfigurować środowisko poleceniem:
source install/setup.bash
⚠️ Pamiętaj, aby w każdym nowym terminalu zanim rozpoczniesz pracę skonfigurować środowisko ROS komendą
source /opt/ros/humble/setup.bash
lubsource install/setup.bash
Należy to robić w każdym nowy terminalu lub zakładce. W kolejnym terminalu uruchom poniższe polecenie, aby sprawdzić czy ROS działa poprawnie:
ros2 topic list
Powinna pojawić się lista aktywnych topików.
4. Przykładowe struktury danych w planowaniu ruchu
4.1 Mapy zajętości
Zainstaluj paczkę ros-humble-nav2-map-server
:
sudo apt-get install ros-humble-nav2-map-server ros-humble-nav2-bringup python3-vcstool
Następnie pobierz repozytorium, które zawiera przykładowe mapy:
cd ~/ros2_ws/src
git clone --branch humble https://github.com/dominikbelter/example_maps
Skompiluj wszystkie paczki znajdujące się w przestrzeni roboczej:
cd ~/ros2_ws/
colcon build --symlink-install
Jeżeli kompilacja zakończyła się sukcesem, można uruchomić serwer, który udostępnia mapę zajętości:
ros2 run nav2_map_server map_server --ros-args --params-file src/example_maps/param/map_server_params.yaml
W osobnym terminalu:
ros2 lifecycle set /map_server configure
ros2 lifecycle set /map_server activate
⚠️ Jeśli pojawia się błąd dot. pliku YAML, należy otworzyć plik
src/example_maps/param/map_server_params.yaml
w edytorze tekstu i sprawdzić, czy parametr (ścieżka)yaml_filename
jest odpowiednio ustawiony (trzeba dopasować nazwę użytkownika w ścieżce).
Server map_server wczytuje mapę zdefiniowaną w pliku
src/example_maps/maps/map_home.yaml
i udostępnia ją w
topiku o nazwie /map
. Mapę można wyświetlić w terminalu za
pomocą polecenia:
ros2 topic echo /map
Kolejne liczby w mapie określają komórki zajęte (100), wolne (0) i nieznane (-1). Mapę można również wyświetlić w programie przeznaczonym do wizualizacji RViz:
ros2 run rviz2 rviz2
Wizualizację można dodać za pomocą przycisku “Add” znajdującym się w lewym dolnym rogu ekranu:
Pojawi się okno pokazane poniżej, w którym trzeba wybrać odpowiedni topik:
Po wybraniu odpowiedniego topika należy zmienić domyślne ustawienia Reliability Policy i Durablility Policy w zakładce Map / Topic na następujące:
a mapa pojawi się w oknie RViz:
Możliwe jest przybliżanie i obracanie mapy za pomocą klawiszy myszy.
4.2 Mapy kosztów
Wczytaną wcześniej mapę wykorzystamy do uzyskania mapy kosztów. Każda
komórka w mapie kosztów będzie reprezentowała koszt przebywania robota w
danym miejscu. Oczywiście będzie on najwyższy dla przeszkód. Do
konwersji mapy zajętości na mapę kosztów wykorzystamy gotowy węzeł
nav2_costmap_2d
. Węzeł ten służy do obliczania mapy kosztów
na mapach 2D.
Na początku należy uruchomić moduł wczytujący mapę z dysku:
ros2 run nav2_map_server map_server --ros-args --params-file src/example_maps/param/map_server_params.yaml
i go skonfigurować:
ros2 lifecycle set /map_server configure
Moduł do obliczenia mapy kosztu uruchamiamy poleceniem:
ros2 run nav2_costmap_2d nav2_costmap_2d
Konieczne jest również publikowanie przekształcenia pomiędzy robotem (base_link) i mapą (map):
ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 map base_link
Konieczna jest również konfiguracja modułu:
ros2 lifecycle set /costmap/costmap configure
Pojawi się topik reprezentujący globalną mapę kosztów (/costmap/costmap).
🔨 Zadanie 4.2.1
Wyświetlić globalną mapę kosztów w RViz. Po ustawieniu topików w Rviz, pamiętaj o aktywowaniu modułu poleceniem:
ros2 lifecycle set /costmap/costmap activate
Później aktywuj moduł map_server:
ros2 lifecycle set /map_server activate
Oczekiwany efekt wygląda następująco:
🔨 Zadanie 4.2.2
Zmodyfikować sposób wyświetlania mapy kosztów (parametr “Color Scheme”). Oczekiwany efekt wygląda następująco:
🔨 Zadanie 4.2.3
Korzystając z komend
w terminalu odczytaj bieżące wartości dwóch parametrów w węźle
/costmap/costmap
:
inflation_layer.cost_scaling_factor
inflation_layer.inflation_radius
.
Zmień wartości tych parametrów w trakcie działania węzła i zaobserwuj efekt w Rvizie.
5. Uruchomienie budowy mapy z wykorzystaniem biblioteki Octomap
System budowy mapy z wykorzystaniem modułu Octomap opisany jest na stronie: https://octomap.github.io/
W mapie typu Octomap przestrzeń podzielona jest na komórki 3D (woksele). Każdy z nich zawiera informację o prawdopodobieństwie zajętości. Aby uruchomić bibliotekę Octomap, należy ją wcześniej zainstalować z repozytorium:
sudo apt-get install ros-humble-octomap ros-humble-octomap-server python3-vcstool
Potrzebny nam będzie również model robota Turtlebot:
sudo apt-get install ros-humble-turtlebot3*
Następnie pobierzemy repozytorium zawierające skrypty uruchomieniowe oraz przykładowe mapy:
cd ~/ros2_ws/src
git clone --branch humble https://github.com/dominikbelter/example_maps
git clone https://github.com/iKrishneel/octomap_server2.git
cd octomap_server2 && vcs import . < deps.repos
Skompiluj wszystkie paczki znajdujące się w przestrzeni roboczej:
cd ~/ros2_ws/
colcon build --symlink-install
⚠️ W przypadku błędu w kompilacji:
fatal error: message_filters/message_event.hpp: No such file or directory 44 | #include <message_filters/message_event.hpp>
należy przejść do katalogu
/home/student/ros2_ws/src/perception_pcl
i cofnąć się do jednego z wcześniejszych commitów:git checkout -b new_branch 44d02743e451296d6bc871b101cea33c59adc1d6
Jeżeli kompilacja zakończyła się sukcesem, należy zmodyfikować model robota Turtlebot3, tak aby korzystał z kamery głębi. W tym celu otworzyć plik:
sudo gedit /opt/ros/humble/share/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf
I dokonać zmian w liniach:
line 369: <sensor name="camera" type="depth">
line 400: <frame_name>camera_rgb_optical_frame</frame_name>
Teraz można uruchomić symulację robota Turtlebot3 wraz z systemem do
budowy mapy (wszystkie uruchamiane moduły oraz ich parametry znajdują
się w pliku
~/ros2_ws/src/example_maps/launch/turtlesim3_waffle_octomap.launch.py
):
source install/setup.bash
export TURTLEBOT3_MODEL=waffle
ros2 launch example_maps turtlesim3_waffle_octomap.launch.py
Do sterowania robotem wykorzystamy moduł
turtlebot3_teleop
(w osobnym terminalu):
cd ~/ros2_ws
source install/setup.bash
export TURTLEBOT3_MODEL=waffle
ros2 run turtlebot3_teleop teleop_keyboard
Sterowanie robotem odbywa się za pomocą klawiszy ‘a’, ‘s’, ‘d’, ‘w’, ‘x’. Podczas poruszania się robota powstaje mapa 3D Octomap.
Oczekiwany wynik jest następujący:
🔨 Zadanie 5.1
Zmodyfikuj plik launch uruchamiający symulację
(~/ros2_ws/src/example_maps/launch/turtlesim3_waffle_octomap.launch.py
),
tak żeby wielkość komórki wynosiła 10 cm.
Oczekiwany wynik: